package SET;

//include:
//HashSet 是 Set 接口的一个实现类，他储存的元素是不可重复的
//HashSet根据对象的哈希值确定元素在集合中的存储位置，具有良好的存取和查找性能
//当向HashSet方法中添加一个元素时候，
//首先会调用hashCode()方法确定元素的存储位置，然后再调用equals()方法确保该位置没有重复元素


import java.util.HashSet;

//这里先创建一个学生类对象，一会儿写入集合中
class Student1
{
    private String id;
    private String name;

    public Student1(String id, String name)
    {
        this.id = id;
        this.name = name;
    }

    public Student1()
    {

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student1{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}


class Student2
{
    private String ID;
    private String name;

    public Student2(String ID, String name)
    {
        this.ID = ID;
        this.name = name;
    }

    public Student2()
    {

    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "ID='" + ID + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    //重写hashCode()方法
    public int hashCode()
    {
        return getID().hashCode(); // 返回ID属性的哈希值
    }

    //重写equals()方法
    public boolean equals(Object obj)
    {
//        if(this == obj)  //判断是否为同一个对象
//        {
//            return true;
//        }
        if(!(obj instanceof Student2))  //判断对象是否为Student类
        {
            return false;
        }
        Student2 stu = (Student2) obj;
        boolean b = this.getID().equals(stu.getID());
        return b;
    }
}


public class hash {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet<>();  //创建集合
        Student1 Stu1 = new Student1("4504", "张三");
        Student1 Stu2 = new Student1("4516","王五");
        Student1 Stu3 = new Student1("4516","王五");

        hashSet.add(Stu1);
        hashSet.add(Stu2);
        hashSet.add(Stu3);
        System.out.println("该Student1集合是否为空：" + hashSet.isEmpty());
        System.out.println("该Student1集合元素为：\n" + hashSet);
        System.out.println("=========================");
        //这里可以看到内容依然是打印了三个数据，这和上面我们讲到的不能有重复数据相矛盾了，这是怎么回事呢？
        //这是因为在定义Student1类时，我们并没有重写hashCode()和equals()方法

        //接下来我们定义Student2类，并且重写这两个方法
        HashSet hs = new HashSet();
        Student2 stu1 = new Student2("1","Jack");
        Student2 stu2 = new Student2("2","Tom");
        Student2 stu3 = new Student2("2","Tom");

        hs.add(stu1);
        hs.add(stu1);
        hs.add(stu2);
        hs.add(stu3);
        System.out.println("该Student2集合元素为：\n" + hs);
    }
}
